package com.fun.demo.juc;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 *这个类是一个同步计数器，主要用于线程间的控制，当 CountDownLatch 的 count 计数>0 时，
 *  await()会造成阻塞，直到 count 变为 0，await()结束阻塞，使用 countDown()会让
 *  count 减 1。 CountDownLatch 的构造函数可以设置 count 值，当 count=1 时，
 *  它的作用类似于 wait()和 notify() 的作用。如果我想让其他线程执行完指定程序，
 *  其他所有程序都执行结束后我再执行，这时可以用 CountDownLatch，但计数无法被重置，
 *  如果需要重置计数，请考虑使用 CyclicBarrier 。
 * */
public class XCountDownLatch {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(10);


        Thread thread1 = new Thread(() ->{
            while (true){
                countDownLatch.countDown();
                long count = countDownLatch.getCount();
                System.out.println(countDownLatch.getCount());
                if(count == 0){
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        thread1.start();


        Thread thread = new Thread(() ->{
            System.out.println("exec start...");
            try {
             //   countDownLatch.await();
                countDownLatch.await(5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("exec end.");
        });
        thread.start();
    }
}
